package api

import (
	"gitee.com/linxing_3/sr-core/domain/api"
	"gitee.com/mkwchecking/sr-admin/apps/devtools/acl"
	"gitee.com/mkwchecking/sr-admin/apps/devtools/service"
	"github.com/gin-gonic/gin"
)

func NewModuleTable(svc *service.ModuleTable) *ModuleTable {
	return &ModuleTable{svc: svc}
}

// ModuleTable
type ModuleTable struct {
	svc *service.ModuleTable
}

// Create
// @Summary	创建模块
// @Tags		devtools
// @Accept		json
// @Produce	json
// @Param		module	body		entity.Module	true	"模块信息"
// @Success	200		{object}	relay.Response{data=entity.Module}
// @Router		/api/v1/devtools/module/table [post]
func (m *ModuleTable) Create(c *gin.Context) {
	req := &acl.ModuleTableInsertReq{}
	apiCtx := api.
		NewCtx(c).
		WithReq(req)
	if !apiCtx.Do() {
		return
	}

	err := m.svc.Insert(apiCtx.Context(), req)
	if err != nil {
		apiCtx.WriteErr(nil, err, err.Error())
	} else {
		apiCtx.WriteOK(nil, "ok")
	}
}

// GetList
// @Summary	获取模块列表
// @Tags		devtools
// @Accept		json
// @Produce	json
// @Success	200	{object}	relay.Response{data=[]entity.Module}
// @Router		/api/v1/devtools/module/table [get]
func (m *ModuleTable) List(c *gin.Context) {
	req := &acl.ModuleTableListReq{}
	apiCtx := api.
		NewCtx(c).
		WithReq(req)

	if !apiCtx.Do() {
		return
	}

	resp, total, err := m.svc.List(apiCtx.Context(), req)
	if err != nil {
		apiCtx.WriteErr(nil, err, err.Error())
	} else {
		apiCtx.WritePageOK(resp, total, req.PageNum, req.PageSize, "ok")
	}
}

// GetDetails
// @Summary	获取模块详情
// @Tags		devtools
// @Accept		json
// @Produce	json
// @Param		module	path		string	true	"模块名称"
// @Success	200		{object}	relay.Response{data=entity.Module}
// @Router		/api/v1/devtools/module/table/{module} [get]
func (m *ModuleTable) GetDetails(c *gin.Context) {
	req := &acl.ModuleTableDetailReq{}
	apiCtx := api.
		NewCtx(c).
		WithReq(req)
	if !apiCtx.Do() {
		return
	}

	resp, err := m.svc.Detail(apiCtx.Context(), req)
	if err != nil {
		apiCtx.WriteErr(nil, err, err.Error())
	} else {
		apiCtx.WriteOK(resp, "ok")
	}
}

// Update
// @Summary	更新模块
// @Tags		devtools
// @Accept		json
// @Produce	json
// @Param		module	path		string	true	"模块名称"
// @Param		module	body		entity.Module	true	"模块信息"
// @Success	200		{object}	relay.Response{data=entity.Module}
// @Router		/api/v1/devtools/module/table/{module} [put]
func (m *ModuleTable) Update(c *gin.Context) {
	req := &acl.ModuleTableUpdateReq{}
	apiCtx := api.
		NewCtx(c).
		WithReq(req)
	if !apiCtx.Do() {
		return
	}
	err := m.svc.Update(apiCtx.Context(), req)
	if err != nil {
		apiCtx.WriteErr(nil, err, err.Error())
	} else {
		apiCtx.WriteOK(nil, "ok")
	}
}

// Delete
// @Summary	删除模块
// @Tags		devtools
// @Accept		json
// @Produce	json
// @Param		module	path		string	true	"模块名称"
// @Success	200		{object}	relay.Response{data=entity.Module}
// @Router		/api/v1/devtools/module/table/{module} [delete]
func (m *ModuleTable) Delete(c *gin.Context) {
	req := &acl.ModuleTableDeleteReq{}
	apiCtx := api.
		NewCtx(c).
		WithReq(req)
	if !apiCtx.Do() {
		return
	}
	err := m.svc.Delete(apiCtx.Context(), req)
	if err != nil {
		apiCtx.WriteErr(nil, err, err.Error())
	} else {
		apiCtx.WriteOK(nil, "ok")
	}
}

func (m *ModuleTable) ImportFromDB(c *gin.Context) {
	req := &acl.ImportDBTable{}
	apiCtx := api.
		NewCtx(c).
		WithReq(req)
	if !apiCtx.Do() {
		return
	}

	err := m.svc.InsertFromDB(apiCtx.Context(), req)
	if err != nil {
		apiCtx.WriteErr(nil, err, err.Error())
		return
	}

	apiCtx.WriteOK(nil, "ok")
}
